package com.sl.gateway.filter;

import cn.hutool.core.collection.CollUtil;
import com.itheima.auth.factory.AuthTemplateFactory;
import com.itheima.auth.sdk.common.Result;
import com.itheima.auth.sdk.dto.AuthUserInfoDTO;
import com.itheima.auth.sdk.service.TokenCheckService;
import com.sl.gateway.config.MyConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

/**
 * 后台管理员token拦截处理
 * AbstractGatewayFilterFactory<Object> 继承这个后就可以在路由配置文件中使用了 使用这个filter进行拦截
 */
@Component
public class ManagerTokenGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> implements AuthFilter {

    @Resource
    private MyConfig myConfig;
    @Resource
    private TokenCheckService tokenCheckService;

    @Value("${role.manager}")
    private List<Long> managerRoleIds;

    /**
     * 先执行这个方法，因为实现了apply方法,然后我们的TokenGatewayFilter就被加入到容器里面了
     * 这样就会自动去执行TokenGatewayFilter里面的内容
     *
     * @param config
     * @return
     */
    @Override
    public GatewayFilter apply(Object config) {
        //由于实现了AuthFilter接口，所以可以传递this对象到TokenGatewayFilter中
        return new TokenGatewayFilter(this.myConfig, this);
    }

    @Override
    public AuthUserInfoDTO check(String token) {
        //校验token
        return tokenCheckService.parserToken(token);
    }

    @Override
    public Boolean auth(String token, AuthUserInfoDTO authUserInfoDTO, String path) {
        // 根据token和UserId 查询权限管家， 得到用户的角色
        // 因为已经启动起来了权限管家 因此直接使用AuthTemplateFactory.get(token)即可
        Result<List<Long>> roleByUserId = AuthTemplateFactory.get(token).opsForRole().findRoleByUserId(authUserInfoDTO.getUserId());

        List<Long> userRoleIds = roleByUserId.getData();

        // 求交集
        return CollUtil.isNotEmpty(CollUtil.intersection(userRoleIds, managerRoleIds));
    }
}
